#include <iostream>
#include <cerrno>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "command.hpp"

// 服务端：创建有名管道，以读的方式打开管道，读取信息进行通信

void readData()
{
    // 1、创建有名管道
    int n = mkfifo(fifo_name.c_str(), mode);
    if (n == -1)
    {
        cerr << "mkfifo fail!" << " errno " << errno << ": strerror" << strerror(errno) << endl;
        return;
    }

    // 2、打开有名管道（只读）
    int rfd = open(fifo_name.c_str(), O_RDONLY);
    if (rfd == -1)
    {
        cerr << "open fail!" << " errno " << errno << ": strerror" << strerror(errno) << endl;
        return;
    }
    cout << "命令管道创建成功！" << endl;

    // 3、进行通信
    cout << "管道文件打开成功！开始通信" << endl;
    char buffer[NUM] = {0}; // 缓冲区

    while (true)
    {
        buffer[0] = 0;
        ssize_t n = read(rfd, buffer, sizeof(buffer) - 1);   //进行信息读取
        cout << "rfd " << rfd << endl;

        //读取失败返回 -1，写端关闭返回 0
        if(n)
        {
            if(n == -1)
            {
                cerr << "read fail!" << " errno " << errno << ": strerror" << strerror(errno) << endl;
                continue;
            }

            //数据已经成功读取至缓冲区中
            buffer[n] = '\0';   //置字符串结束标志
            cout << "Sever accept# " << buffer << endl;
            fflush(stdout); //需要手动刷新至显示屏

            // //逐字符读取
            // printf("%c", buffer[0]);
            // fflush(stdout);            
        }
        else
        {
            cout << "客户端(client)已关闭，服务端(sever)也将关闭！" << endl;
            break;
        }
    }

    // 通信结束后，需要关闭 fd、删除有名管道
    close(rfd);
    unlink(fifo_name.c_str());
}

int main()
{
    readData();
    return 0;
}